軟體測試金字塔:理解單元測試、整合測試和端對端測試的角色

2024-04-16 Tue

本文將依據介紹測試類型及相關的類型介紹最後提及測試的模式最佳實踐包含以下內容

  • 測試類型
    • 單元測試 (Unit Test)
    • 整合測試 (Integration Test)
    • 端對端測試 (End to end Test 或稱 E2E
    • 測試類型重點整理
  • 測試金字塔 - Test Pyramid
  • 冰淇淋反模式 - Ice Cream Cone Anti-Pattern
  • 參考資料

測試類型

在軟體開發當中為了確保應用程式的穩定,我們會透過撰寫測試程式碼來確保產品上線減少錯誤,以下將簡單介紹三種測試類型並淺談其中所扮演的角色

  • 單元測試 (Unit Test)
  • 整合測試 (Integration Test)
  • 端對端測試 (End to end Test 或稱 E2E Test)

單元測試 (Unit Test)

image 圖片來源:AWS - 什麼是單元測試?

在測試當中作為最基本和最小的測試類型,可以用來測試函式、類別或是元件的運作,例如有一個購物車系統當中有個計算商品總價的函式,我們僅測試這個商品相加的函式是否運作正常,因此對於我們所建立的這項測試並不會涉及像是客戶註冊、資料更新的內容,換句話說就是具有隔離性獨立於其他的單元 (Unit),

由於獨立於其他單元,當我們需要進行像是得到後端 API 的資料測試這個函式是否運作正常,我們得藉由模擬的方式才能做一個完整的單元測試,另一方面,也因為單元測試是以單元為基礎,而且能夠獨立運作通常測試時間也相較於其他類型的測試來的快速,並且可以馬上知道失敗後是哪個位置出現問題。

整合測試 (Integration Test)

當我們做完單元測試之後有可能測試單元成功,但是如果在各個單元互相運作的時候出現了問題,以下面的謎因圖為例子,測試傘桿伸長與傘面大開都能運作正常,當兩個單元協同在一起運作的時候卻出現了問題。

圖片來源:gifer

因此我們需要藉由整合測試來確保整個應用程式架構可以相互合作,例如當我們客戶在電商平台當中完成付款之後,庫存的系統也能正確的更新商品的數量,這些相互作用的測試就被稱之為整合測試。

由於整合測試需要載入多個模組,並且一個流程當中涉及了多個動作例如驗證表單、資料驗證邏輯、資料庫交互作用等等,所以相較於單元測試來說整體測試時間也會比較長。

端對端測試 (End to end Test 或稱 E2E Test)

端對端測試可以說是在整個應用程式最後的測試,通常可以作為上線前的最終驗證,以一個電商平台為例子可能涉及到登入、選擇商品、加入購物車、填寫相關表單到付款,確保每一步都可以如期執行。

這些包含了使用真實的 UI 介面、串接後端資料庫、相關服務像是電子郵件寄送的服務,在整個過程當中也是花費較長的測試時間,因為要與這些服務或者後端伺服器進行交互並且整合,以確保與真實的生產環境盡可能相似。

由於必須使用真實的後端伺服器以及相關服務,因此如果應用程式部署在雲端平台,則伺服器運作的成本以及使用第三方電子郵件服務的費用都將成為端對端測試的成本,使得這類測試的成本也是最高。

測試類型重點整理

以下針對每項測試進行重點整理

  • Unit Tests
    • 聚焦在獨立建置的應用程式區域像是 Class 或者函式或是元件
    • 對於每一個單元 (Unit) 或者建置區域是被個別的測試,獨立於其他單元 (Unit)
    • 依賴像是 API 資料或者所需參數是透過模擬的方式
    • 執行事較少的時間
    • 容易得知失敗原因
    • 容易撰寫和維護
  • Integration Tests
    • 聚焦在單元測試的組合
    • 確保模組之間協同運行
    • 花費時間比單元測試長
  • E2E Tests
    • 聚焦在測試整個應用程式的流程
    • 確保從開始到結束按照設計的運行
    • 使用真實的 UI、真實的後端資料庫、真實的服務
    • 花費最長的時間
    • 涵蓋了最多實際運作的程式碼數量
    • 涉及昂貴的成本花費例如像是真實的 API 進行交互的伺服器成本
    • 較難得知失敗原因

測試金字塔 - Test Pyramid

因此我們可以將上述三種的測試類型會製成一張金字塔形狀來描述,底層是單元測試、其數量是最多並且成本是最低、測試速度是最快、涵蓋的程式碼也是最少。反之頂層的端對端測試是測試數量最少、測試速度比較慢,但是涵蓋的整個應用程式的程式碼是最多。

如下圖

image

這項金字塔的模型來自於Succeeding with Agile書,作者建議的依照此比例的測試來分配各項測試類型。

圖片來源:martinfowler - Test Pyramid

冰淇淋反模式 - Ice Cream Cone Anti-Pattern

反之冰淇淋 (Ice-cream cone) 作為反模式 (Anti-pattern),可能短起內能夠解決問題,但長期來說會帶來更多的負面影響,如下圖

當軟體的開發隨著進展功能越來越多的時候,這些高層次的測試不容易查找錯誤,容易受到整個系統的狀態影響。

image 圖片來源:Test Pyramid & Antipatterns

參考資料